package JUC;


/**
 * Desc:传统单例模式
 *
 * @return {@link null}
 * @author 豆包LU
 * @date 2023/5/6 9:02
 */
/*public class Singleton {
    // 定义一个私有的静态实例变量，初始值为 null
    private static Singleton instance = null;

    // 定义私有构造函数，防止外部通过 new 关键字创建实例
    private Singleton() {
        // 可以在构造函数中添加需要执行的逻辑
        System.out.println(Thread.currentThread().getName() +
                "Singletonton构造⽅法执⾏了" );
    }

    // 定义一个公有的静态方法，返回实例变量
    public static Singleton getInstance() {
        // 如果实例变量为 null，则创建新的实例
        if (instance == null) {
            instance = new Singleton();
        }
        // 返回实例变量
        return instance;
    }

    // 测试代码
    public static void main(String[] args) {
        // 调用 getInstance() 方法获取实例
        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();

        // 判断两个实例是否相同
        if (s1 == s2) {
            System.out.println("s1 和 s2 是同一个实例");
        } else {
            System.out.println("s1 和 s2 不是同一个实例");
        }
    }
}*/

/*多线程下的单例模式*/
/*public class Singleton {
    // 定义一个私有的静态实例变量，初始值为 null
    private static Singleton instance = null;

    // 定义私有构造函数，防止外部通过 new 关键字创建实例
    private Singleton() {
        // 可以在构造函数中添加需要执行的逻辑
        System.out.println(Thread.currentThread().getName() +
                "\t"+"Singletonton构造⽅法执⾏了" );
    }

    // 定义一个公有的静态方法，返回实例变量
    public static Singleton getInstance() {
        // 如果实例变量为 null，则创建新的实例
        if (instance == null) {
            instance = new Singleton();
        }
        // 返回实例变量
        return instance;
    }

    // 测试代码
    public static void main(String[] args) {
        // 创建多个线程，同时调用 getInstance() 方法获取实例
        for (int i = 0; i < 10; i++) {
            new Thread(()->{
                Singleton.getInstance();
            },String.valueOf(i)).start();
        }
    }
}*/

public class Singleton {
    // 定义一个私有的静态实例变量，初始值为 null
    private static Singleton instance = null;

    // 定义私有构造函数，防止外部通过 new 关键字创建实例
    private Singleton() {
        // 可以在构造函数中添加需要执行的逻辑
        System.out.println(Thread.currentThread().getName() +
                "\t"+"Singletonton构造⽅法执⾏了" );
    }

    // 定义一个公有的静态方法，返回实例变量
    public static Singleton getInstance() {
        // 第一重检查，判断实例变量是否为 null
        if (instance == null) {
            // 在 synchronized 代码块中进行第二重检查
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        // 返回实例变量
        return instance;
    }

    // 测试代码
    public static void main(String[] args) {
        // 创建多个线程，同时调用 getInstance() 方法获取实例
        for (int i = 0; i < 10000; i++) {
            new Thread(()->{
                Singleton.getInstance();
            },String.valueOf(i)).start();
        }
    }
}